package com.czmini.cztest.service.impl;

import com.czmini.cztest.common.TokenDb;
import com.czmini.cztest.dao.ZcTestJenkinsMapper;
import com.czmini.cztest.dao.ZcTestUserMapper;
import com.czmini.cztest.dto.PageTableRequest;
import com.czmini.cztest.dto.PageTableResponse;
import com.czmini.cztest.dto.ResultDto;
import com.czmini.cztest.dto.TokenDto;
import com.czmini.cztest.dto.jenkins.QueryZcTestJenkinsListDto;
import com.czmini.cztest.dto.testcase.QueryTestCaseListDto;
import com.czmini.cztest.entity.ZcTestJenkins;
import com.czmini.cztest.entity.ZcTestUser;
import com.czmini.cztest.service.ZcTestJenkinsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * @ProjectName: cztest
 * @Package: com.czmini.cztest.service.impl
 * @ClassName: ZcTestJenkinsServiceImpl
 * @Author: 还是那个橙子
 * @Description: 接口实现类
 * @Date: 2022/3/16 21:54
 * @Version: 1.0
 */
@Service
public class ZcTestJenkinsServiceImpl implements ZcTestJenkinsService {
    @Autowired
    private TokenDb tokenDb;

    @Autowired
    private ZcTestJenkinsMapper zcTestJenkinsMapper;

    @Autowired
    private ZcTestUserMapper zcTestUserMapper;

    @Override
    @Transactional(rollbackFor = Exception.class)
    public ResultDto<ZcTestJenkins> save(TokenDto tokenDto, ZcTestJenkins zcTestJenkins) {
        zcTestJenkins.setCreateTime(new Date());
        zcTestJenkins.setUpdateTime(new Date());

        zcTestJenkinsMapper.insertUseGeneratedKeys(zcTestJenkins);

        Integer jenkinsFlag = zcTestJenkins.getDefaultJenkinsFlag();
        //若默认标记为1,删除位
        if (Objects.nonNull(jenkinsFlag)&&jenkinsFlag==1){
            //get id
            Integer createUserId = zcTestJenkins.getCreateUserId();
            ZcTestUser zcTestUser = new ZcTestUser();
            zcTestUser.setId(createUserId);
            zcTestUser.setDefaultJenkinsId(zcTestJenkins.getId());

            //更新token信息中的默认JenkinsId
            tokenDto.setDefaultJenkinsId(zcTestJenkins.getId());
            tokenDb.addTokenDto(tokenDto.getToken(),tokenDto);
            //更新id
            zcTestUserMapper.updateByPrimaryKeySelective(zcTestUser);
        }
        return ResultDto.success("成功",zcTestJenkins);
    }

    /**
     * 修改Jenkins信息
     * @param tokenDto
     * @param zcTestJenkins
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public ResultDto<ZcTestJenkins> update(TokenDto tokenDto, ZcTestJenkins zcTestJenkins) {
        ZcTestJenkins queryTestJenkins = new ZcTestJenkins();
        queryTestJenkins.setId(zcTestJenkins.getId());
        queryTestJenkins.setCreateUserId(zcTestJenkins.getCreateUserId());

        ZcTestJenkins resultJenkins = zcTestJenkinsMapper.selectOne(queryTestJenkins);
        if (Objects.isNull(resultJenkins)) {
            return ResultDto.fail("未查到Jenkins信息");
        }
        zcTestJenkins.setCreateTime(resultJenkins.getCreateTime());
        zcTestJenkins.setUpdateTime(new Date());

        int defaultJenkins = zcTestJenkinsMapper.updateByPrimaryKey(zcTestJenkins);

        if (Objects.nonNull(defaultJenkins)&&defaultJenkins==1){
            Integer createUserId = zcTestJenkins.getCreateUserId();
            ZcTestUser testUser = new ZcTestUser();
            testUser.setId(createUserId);
            testUser.setDefaultJenkinsId(zcTestJenkins.getId());

            //更新token信息中的默认JenkinsId
            tokenDto.setDefaultJenkinsId(zcTestJenkins.getId());
            tokenDb.addTokenDto(tokenDto.getToken(), tokenDto);

            zcTestJenkinsMapper.updateByPrimaryKeySelective(zcTestJenkins);

        }
        return  ResultDto.success("成功");
    }

    @Override
    // 列表查询
    public ResultDto<PageTableResponse<ZcTestJenkins>> list(PageTableRequest<QueryZcTestJenkinsListDto> pageTableRequest) {
        // 分页查询
        QueryZcTestJenkinsListDto params = pageTableRequest.getParams();
        // 分页num
        Integer pageNum = pageTableRequest.getPageNum();
        //分页大小
        Integer pageSize = pageTableRequest.getPageSize();
        Integer createUserId = params.getCreateUserId();

        ZcTestUser zcTestUser = new ZcTestUser();
        //表关联
        zcTestUser.setId(createUserId);
        //查到对应登录账号新建的数据
        ZcTestUser resultZctester = zcTestUserMapper.selectOne(zcTestUser);
        Integer defaultJenkinsId = resultZctester.getDefaultJenkinsId();

        //查出全部数据
        Integer count = zcTestJenkinsMapper.count(params);

        // 在分页设置
        List<ZcTestJenkins> zcTestJenkinsList = zcTestJenkinsMapper
                .list(params, (pageNum - 1) * pageSize, pageSize);
        //查找默认的jenkins
        for (ZcTestJenkins zcTestJenkins:zcTestJenkinsList){
            if (zcTestJenkins.getId().equals(defaultJenkinsId)){
                zcTestJenkins.setDefaultJenkinsFlag(1);
            }
        }
        //响应
        PageTableResponse<ZcTestJenkins> pageTableResponse = new PageTableResponse<>();
        pageTableResponse.setRecordsTotal(count);
        pageTableResponse.setData(zcTestJenkinsList);
        return ResultDto.success("成功", pageTableResponse);
    }

    /**
     *  删除相关
     * @param jenkinsId
     * @param tokenDto
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public ResultDto<ZcTestJenkins> delete(Integer jenkinsId, TokenDto tokenDto) {
        ZcTestJenkins queryzcTestJenkins = new ZcTestJenkins();

        queryzcTestJenkins.setId(jenkinsId);
        queryzcTestJenkins.setCreateUserId(tokenDto.getUserId());
        //查询
        ZcTestJenkins result = zcTestJenkinsMapper.selectOne(queryzcTestJenkins);

        //如果为空，则提示，也可以直接返回成功
        if(Objects.isNull(result)){
            return ResultDto.fail("未查到Jenkins信息");
        }

        ZcTestUser queryZcTestUser = new ZcTestUser();
        queryZcTestUser.setId(tokenDto.getUserId());

        ZcTestUser querytestUser = zcTestUserMapper.selectOne(queryZcTestUser);

        Integer defaultJenkinsId = querytestUser.getDefaultJenkinsId();
        //
        if (Objects.nonNull(defaultJenkinsId) && defaultJenkinsId.equals(jenkinsId)){
            ZcTestUser zcTestUser = new ZcTestUser();
            zcTestUser.setId(tokenDto.getUserId());
            zcTestUser.setDefaultJenkinsId(null);

            //更新token信息中的默认JenkinsId
            tokenDto.setDefaultJenkinsId(null);
            tokenDb.addTokenDto(tokenDto.getToken(), tokenDto);
            zcTestUserMapper.updateByPrimaryKeySelective(zcTestUser);
        }
        zcTestJenkinsMapper.deleteByPrimaryKey(jenkinsId);
        return ResultDto.success("成功");
    }
}
